home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsfengines.jar / com / ibm / bsf / engines / activescript / ActiveScriptEngine.class (.txt) next >
Encoding:
Java Class File  |  1999-12-09  |  8.9 KB  |  348 lines

  1. package com.ibm.bsf.engines.activescript;
  2.  
  3. import com.ibm.bsf.BSFDeclaredBean;
  4. import com.ibm.bsf.BSFException;
  5. import com.ibm.bsf.BSFManager;
  6. import com.ibm.bsf.util.BSFEngineImpl;
  7. import com.ibm.bsf.util.EngineUtils;
  8. import java.util.Hashtable;
  9. import java.util.Vector;
  10.  
  11. public class ActiveScriptEngine extends BSFEngineImpl implements JavaBeanAddEventListener {
  12.    static BSFException dllLoadException = null;
  13.    static final String libName = "bsfactivescriptengine";
  14.    static final String LANG_VBSCRIPT = "vbscript";
  15.    static final String LANG_PERLSCRIPT = "perlscript";
  16.    static final String LANG_JSCRIPT = "jscript";
  17.    byte[] css;
  18.    BSFManager bsfmgr;
  19.    private Hashtable evalRet;
  20.    protected String lang;
  21.  
  22.    protected final boolean isVBScript() {
  23.       return this.lang.equalsIgnoreCase("vbscript");
  24.    }
  25.  
  26.    protected final boolean isPerlScript() {
  27.       return this.lang.equalsIgnoreCase("perlscript");
  28.    }
  29.  
  30.    protected final boolean isJScript() {
  31.       return this.lang.equalsIgnoreCase("jscript");
  32.    }
  33.  
  34.    protected final boolean isCaseSensitive() {
  35.       return this.isVBScript();
  36.    }
  37.  
  38.    public final void setEvalRet(Object var1) {
  39.       this.evalRet.put(new Integer(Thread.currentThread().hashCode()), var1 != null ? var1 : this.evalRet);
  40.    }
  41.  
  42.    private final boolean terminated() {
  43.       return this.css == null;
  44.    }
  45.  
  46.    private native void nativeInit(String var1, String var2, Object[] var3) throws BSFException;
  47.  
  48.    private native Object nativeEval(byte[] var1, int var2, int var3, String var4, boolean var5) throws BSFException;
  49.  
  50.    private native void nativeTerminate(byte[] var1) throws BSFException;
  51.  
  52.    public void initialize(BSFManager var1, String var2, Vector var3) throws BSFException {
  53.       if (dllLoadException != null) {
  54.          throw dllLoadException;
  55.       } else {
  56.          synchronized(this){}
  57.  
  58.          try {
  59.             if (this.lang != null) {
  60.                this.lang = var2;
  61.                throw new BSFException(BSFException.REASON_OTHER_ERROR, "Engine " + this + " initialized again");
  62.             }
  63.  
  64.             this.lang = var2;
  65.          } catch (Throwable var14) {
  66.             throw var14;
  67.          }
  68.  
  69.          super.initialize(var1, var2, var3);
  70.          if (this.isPerlScript()) {
  71.             this.evalRet = new Hashtable();
  72.          }
  73.  
  74.          this.bsfmgr = var1;
  75.          this.nativeInit(this.lang, (String)null, (Object[])null);
  76.          if (this.css == null) {
  77.             throw new BSFException(BSFException.REASON_OTHER_ERROR, "Engine " + this + " failed to initialize native interface properly.");
  78.          } else {
  79.             if (var3.size() != 0) {
  80.                String var4 = "";
  81.                String var5 = "";
  82.                String var6 = "";
  83.                String var7 = "";
  84.                String var8 = "";
  85.                if (this.isVBScript()) {
  86.                   var4 = "SET ";
  87.                   var5 = "=bsf.lookupBean(\"";
  88.                   var6 = "\")";
  89.                   var7 = ":";
  90.                   var8 = "";
  91.                } else if (this.isJScript()) {
  92.                   var4 = "var ";
  93.                   var5 = "=bsf.lookupBean(\"";
  94.                   var6 = "\")";
  95.                   var7 = ";";
  96.                   var8 = var7;
  97.                } else {
  98.                   if (!this.isPerlScript()) {
  99.                      throw new BSFException(BSFException.REASON_OTHER_ERROR, this.lang + " does not support undeclareBean.");
  100.                   }
  101.  
  102.                   var4 = "$";
  103.                   var5 = "=$bsf->lookupBean('";
  104.                   var6 = "')";
  105.                   var7 = ";";
  106.                   var8 = var7;
  107.                }
  108.  
  109.                StringBuffer var9 = new StringBuffer("");
  110.                int var10 = var3.size();
  111.  
  112.                for(int var11 = 0; var11 < var10; ++var11) {
  113.                   BSFDeclaredBean var12 = (BSFDeclaredBean)var3.elementAt(var11);
  114.                   var9.append(var4 + var12.name + var5 + var12.name + var6 + (var11 < var10 - 1 ? var7 : var8));
  115.                }
  116.  
  117.                this.exec("<declareBean>", 0, 0, var9.toString());
  118.             }
  119.  
  120.          }
  121.       }
  122.    }
  123.  
  124.    public void exec(String var1, int var2, int var3, Object var4) throws BSFException {
  125.       synchronized(this){}
  126.  
  127.       try {
  128.          if (this.terminated()) {
  129.             throw new BSFException(BSFException.REASON_OTHER_ERROR, "Exec or eval called after engine termination!");
  130.          }
  131.       } catch (Throwable var7) {
  132.          throw var7;
  133.       }
  134.  
  135.       this.nativeEval(this.css, var2, var3, var4.toString(), false);
  136.    }
  137.  
  138.    public Object eval(String var1, int var2, int var3, Object var4) throws BSFException {
  139.       if (!this.isPerlScript()) {
  140.          return this.nativeEval(this.css, var2, var3, var4.toString(), true);
  141.       } else {
  142.          Integer var5 = new Integer(Thread.currentThread().hashCode());
  143.          this.nativeEval(this.css, var2, var3, "$bsf->setEvalRet(" + var4.toString() + "); #via eval", false);
  144.          Object var6 = this.evalRet.get(var5);
  145.          if (var6 == this.evalRet) {
  146.             var6 = null;
  147.          }
  148.  
  149.          this.evalRet.put(var5, this.evalRet);
  150.          return var6;
  151.       }
  152.    }
  153.  
  154.    public Object call(Object var1, String var2, Object[] var3) throws BSFException {
  155.       StringBuffer var4 = new StringBuffer(300);
  156.       var4.append(var1.toString());
  157.       var4.append(".");
  158.       var4.append(var2);
  159.       var4.append("(");
  160.       if (var3 != null) {
  161.          for(int var5 = 0; var5 < var3.length; ++var5) {
  162.             var4.append(var3[var5].toString());
  163.             if (var5 < var3.length - 1) {
  164.                var4.append(",");
  165.             }
  166.          }
  167.       }
  168.  
  169.       var4.append(")");
  170.       return this.eval("<internal>", -1, -1, var4.toString());
  171.    }
  172.  
  173.    private final Object callBeanMethod(Object var1, String var2, Object[] var3) throws BSFException {
  174.       if (var1.equals(this) && var2.equals("callMethodViaBSF")) {
  175.          return this.callMethodViaBSF(var3[0]);
  176.       } else {
  177.          return var1.equals(this) && var2.equals("createBean") ? this.createBean(var3[0]) : EngineUtils.callBeanMethod(var1, var2, var3);
  178.       }
  179.    }
  180.  
  181.    final Object callMethodViaBSF(Object[] var1) throws BSFException {
  182.       Object[] var2 = new Object[var1.length - 2];
  183.       if (var1.length > 2) {
  184.          System.arraycopy(var1, 2, var2, 0, var1.length - 2);
  185.       }
  186.  
  187.       return EngineUtils.callBeanMethod(var1[0], (String)var1[1], var2);
  188.    }
  189.  
  190.    final Object createBean(Object[] var1) throws BSFException {
  191.       Object[] var2 = new Object[var1.length - 1];
  192.       if (var1.length > 1) {
  193.          System.arraycopy(var1, 1, var2, 0, var1.length - 1);
  194.       }
  195.  
  196.       return EngineUtils.createBean((String)var1[0], var2);
  197.    }
  198.  
  199.    public void addEventListener(Object var1, String var2, String var3, String var4) throws BSFException {
  200.       EngineUtils.addEventListener(var1, var2, var3, this, this.bsfmgr, "ActiveScriptEngine", 0, 0, var4);
  201.    }
  202.  
  203.    public final int bindMember(Object var1, String var2, short var3) throws Exception {
  204.       return JavaBean.bindMember(var1.getClass(), var2, var3);
  205.    }
  206.  
  207.    public final Object callMethod(Object var1, int var2, Object[] var3) throws Exception {
  208.       return JavaBean.callMethod(this, var1, var2, var3);
  209.    }
  210.  
  211.    public final Object lookupBean(String var1) {
  212.       return this.bsfmgr.lookupBean(var1);
  213.    }
  214.  
  215.    public final void declareBean(BSFDeclaredBean var1) throws BSFException {
  216.       if (this.isVBScript()) {
  217.          this.exec("<declareBean>", 0, 0, "SET " + var1.name + "=bsf.lookupBean(\"" + var1.name + "\") 'via declareBean");
  218.       } else if (this.isJScript()) {
  219.          this.exec("<declareBean>", 0, 0, "var " + var1.name + "=bsf.lookupBean(\"" + var1.name + "\"); //via declareBean");
  220.       } else if (this.isPerlScript()) {
  221.          this.exec("<declareBean>", 0, 0, "$" + var1.name + "=$bsf->lookupBean('" + var1.name + "'); #via declareBean");
  222.       } else {
  223.          throw new BSFException(BSFException.REASON_OTHER_ERROR, this.lang + " does not support declareBean.");
  224.       }
  225.    }
  226.  
  227.    public void undeclareBean(BSFDeclaredBean var1) throws BSFException {
  228.       if (this.isVBScript()) {
  229.          this.exec("<undeclareBean>", 0, 0, "SET " + var1.name + "=Nothing 'via undeclareBean");
  230.       } else if (this.isJScript()) {
  231.          this.exec("<undeclareBean>", 0, 0, var1.name + "=null; // via undeclareBean");
  232.       } else if (this.isPerlScript()) {
  233.          this.exec("<undeclareBean>", 0, 0, "undef " + var1.name + " ; #via undeclareBean");
  234.       } else {
  235.          throw new BSFException(BSFException.REASON_OTHER_ERROR, this.lang + " does not support undeclareBean.");
  236.       }
  237.    }
  238.  
  239.    private static final byte[] objectToVariant(Object var0) {
  240.       byte[] var1 = new byte[16];
  241.       if (var0 instanceof Boolean) {
  242.          var1[0] = 11;
  243.          var1[1] = 0;
  244.          byte var2 = (byte)((Boolean)var0 ? 255 : 0);
  245.          var1[8] = var2;
  246.          var1[9] = var2;
  247.          var1[10] = var2;
  248.          var1[11] = var2;
  249.       } else if (var0 instanceof Integer) {
  250.          var1[0] = 3;
  251.          var1[1] = 0;
  252.          int var4 = (Integer)var0;
  253.          var1[8] = (byte)var4;
  254.          var1[9] = (byte)(var4 >>> 8 & 255);
  255.          var1[10] = (byte)(var4 >>> 16 & 255);
  256.          var1[11] = (byte)(var4 >>> 24 & 255);
  257.       } else if (var0 instanceof String) {
  258.          var1[0] = 8;
  259.          var1[1] = 0;
  260.       } else if (var0 instanceof Long) {
  261.          var1[0] = 5;
  262.          var1[1] = 0;
  263.          long var5 = Double.doubleToLongBits((double)(Long)var0);
  264.          var1[8] = (byte)((int)var5);
  265.          var1[9] = (byte)((int)(var5 >>> 8 & 255L));
  266.          var1[10] = (byte)((int)(var5 >>> 16 & 255L));
  267.          var1[11] = (byte)((int)(var5 >>> 24 & 255L));
  268.          var1[12] = (byte)((int)(var5 >>> 32 & 255L));
  269.          var1[13] = (byte)((int)(var5 >>> 40 & 255L));
  270.          var1[14] = (byte)((int)(var5 >>> 48 & 255L));
  271.          var1[15] = (byte)((int)(var5 >>> 56 & 255L));
  272.       } else if (var0 instanceof Short) {
  273.          var1[0] = 2;
  274.          var1[1] = 0;
  275.          int var6 = Float.floatToIntBits((Float)var0);
  276.          var1[8] = (byte)var6;
  277.          var1[9] = (byte)(var6 >>> 8 & 255);
  278.          var1[10] = (byte)(var6 >>> 16 & 255);
  279.          var1[11] = (byte)(var6 >>> 24 & 255);
  280.       } else if (var0 instanceof Float) {
  281.          var1[0] = 4;
  282.          var1[1] = 0;
  283.          int var7 = Float.floatToIntBits((Float)var0);
  284.          var1[8] = (byte)var7;
  285.          var1[9] = (byte)(var7 >>> 8 & 255);
  286.          var1[10] = (byte)(var7 >>> 16 & 255);
  287.          var1[11] = (byte)(var7 >>> 24 & 255);
  288.       } else if (var0 instanceof Double) {
  289.          var1[0] = 5;
  290.          var1[1] = 0;
  291.          long var8 = Double.doubleToLongBits((Double)var0);
  292.          var1[8] = (byte)((int)var8);
  293.          var1[9] = (byte)((int)(var8 >>> 8 & 255L));
  294.          var1[10] = (byte)((int)(var8 >>> 16 & 255L));
  295.          var1[11] = (byte)((int)(var8 >>> 24 & 255L));
  296.          var1[12] = (byte)((int)(var8 >>> 32 & 255L));
  297.          var1[13] = (byte)((int)(var8 >>> 40 & 255L));
  298.          var1[14] = (byte)((int)(var8 >>> 48 & 255L));
  299.          var1[15] = (byte)((int)(var8 >>> 56 & 255L));
  300.       } else if (var0 instanceof Byte) {
  301.          var1[0] = 17;
  302.          var1[1] = 0;
  303.          byte var9 = (Byte)var0;
  304.          var1[8] = var9;
  305.       } else if (var0 instanceof Character) {
  306.          var1[0] = 17;
  307.          var1[1] = 0;
  308.          byte var10 = (byte)(Character)var0;
  309.          var1[8] = var10;
  310.       } else if (var0 instanceof Void) {
  311.          var1[0] = 1;
  312.          var1[1] = 0;
  313.       } else {
  314.          var1[0] = 9;
  315.          var1[1] = 0;
  316.       }
  317.  
  318.       return var1;
  319.    }
  320.  
  321.    public synchronized void terminate() throws BSFException {
  322.       if (!this.terminated()) {
  323.          byte[] var1 = this.css;
  324.          this.css = null;
  325.          this.bsfmgr = null;
  326.          this.evalRet = null;
  327.          this.lang = null;
  328.          this.nativeTerminate(var1);
  329.       }
  330.  
  331.    }
  332.  
  333.    protected void finalize() throws Throwable {
  334.       this.terminate();
  335.       super.finalize();
  336.    }
  337.  
  338.    static {
  339.       try {
  340.          System.loadLibrary("bsfactivescriptengine");
  341.       } catch (SecurityException var1) {
  342.          dllLoadException = new BSFException(BSFException.REASON_OTHER_ERROR, "SecurityException loading library:bsfactivescriptengine " + ((Throwable)var1).getMessage(), var1);
  343.       } catch (UnsatisfiedLinkError var2) {
  344.          dllLoadException = new BSFException(BSFException.REASON_OTHER_ERROR, "UnsatisfiedLinkError loading library:bsfactivescriptengine " + ((Throwable)var2).getMessage(), var2);
  345.       }
  346.    }
  347. }
  348.